package tests;

import packageServer.Carnivoro;
import packageServer.Dinosauro;
import packageServer.Erbivoro;
import packageServer.Mappa;
import tests.MockDinosauro;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestDinosauro {


	private Dinosauro d,dc,de;
	Mappa m;
	
	@Before
	public void setUp() throws Exception {
		d=new MockDinosauro(1);
		dc=new Carnivoro(2);
		de=new Erbivoro(3);
		m=new Mappa("casuale");
	}

	@After
	public void tearDown() throws Exception {
		d=null;
	}

	@Test
	public void testDinosauro() {
		assertNotNull(d);
	
	}


	@Test
	public void testInvecchia() {
		assertTrue(d.getVita_max()>23);
		assertTrue(d.getVita_max()<37);
		d.setTurnivissuti(d.getVita_max());
		assertFalse(d.invecchia());
	}

	@Test
	public void testCalcolaForza() {
		assertNotSame(0,d.calcolaForza());
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		assertTrue(dc.calcolaForza()==dc.getEnergia()*2*dc.getDimensione());
		
	}


	@Test
	public void testControllaErbivoro() {
		de.setDimensione(1);
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		de.setDimensione(2);
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		de.setDimensione(3);
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		de.setDimensione(4);
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		de.setDimensione(5);
		assertTrue(de.calcolaForza()==de.getEnergia()*de.getDimensione());
		
		dc.setDimensione(1);
		assertFalse(dc.calcolaForza()==dc.getEnergia()*dc.getDimensione());
		dc.setDimensione(2);
		assertFalse(dc.calcolaForza()==dc.getEnergia()*dc.getDimensione());
		dc.setDimensione(3);
		assertFalse(dc.calcolaForza()==dc.getEnergia()*dc.getDimensione());
		dc.setDimensione(4);
		assertFalse(dc.calcolaForza()==dc.getEnergia()*dc.getDimensione());
		dc.setDimensione(5);
		assertFalse(dc.calcolaForza()==dc.getEnergia()*dc.getDimensione());
	}

	@Test
	public void testControlloMossa() {
		m.getCella(1, 1).setTipo("t");
		m.getCella(1,2).setTipo("a");
		d.setPosX(1);
		d.setPosY(1);
		assertFalse(d.controlloMossa(m, 1, 2)); //in acqua
		assertFalse(d.controlloMossa(m, 1, 20)); //oltre maxMove
		assertFalse(d.controlloMossa(m, 43, 2)); //oltre confini mappa
		m.getCella(2, 2).setTipo("a");
		m.getCella(2, 1).setTipo("a");
		m.getCella(3, 3).setTipo("t");
		assertFalse(d.controlloMossa(m, 3, 3)); //nessun percorso
		m.getCella(2, 2).setTipo("t");
		m.getCella(3, 3).setTipo("t");
		assertTrue(d.controlloMossa(m, 3, 3)); //esiste valido
	}

}
